JavaScript 散碎知识点
包含一些细碎知识点
Object.keys() 会返回有一定顺序数组,排序规则商榷
undefined 不是关键字
forEach 和 map 和 some,every 都会跳过空元素 empty ,但是不同的是 map 会保留这个值,请看 vcr
for of 不会跳过,并且会处理为 undefined ; for in 会跳过
如果 script 标签是由 JavaScript 代码创建的,标签的 async 属性会默认为 true
addEventLister 与 onxxx 的区别
passive: true 优化滚动性能
onxxx绑定的事件就不能想 addEventListener 这样
但是手动绑定滚动事件,不传 passive,都是默认 { passive:false } 的

另外这里讨论的是诸如wheel,touchmove此类。scroll不行,应为scroll本质是浏览器确定此次滚动可执行后执行的事件。e.preventDefault是在确定滚动前所执行的,e也是触发器对象
EventTarget.addEventListener() - Web API 接口参考 | MDN
requestAnimationFrame()
- 简述:在下一次渲染之前执行回调(这可不管什么微任务宏任务,但是回调时间本身需要运行时间超过一次事件循环的时间也会卡顿,但是一个回调你要执行多少?难道 10000000 次循环?)
- 为什么定时器就会卡,因为其他宏任务或者微任务的存在,导致定时器的回调并不是指定时间执行一次;
- 因为定时器是隔指定时间将回调放到宏任务队列中,但是这个时候万一还有微任务或者其他宏任务排在前面,所以执行时间就不是指定的时间了
- 定时器时间不固定,而帧渲染间隔相等,就会产生抖动的效果。
function 会提升的同时赋值
new 关键字的优先级问题

带参就是带括号
getPrototypeOf
getPrototypeOf 获取的是隐式原型对象
闭包实现变量私有化
new.target
如果函数是通过 new 关键字调用的,返回此函数,否则就是 undefined
isNaN(undefined) // true
用 Number.isNaN 可以准确判断
[] == [] // false '==' 比较对象比较的是引用,基础类型是隐式转化
各种宽度及位置属性
- offsetWidth 和 offsetHeight:
- 区别:
offsetWidth和offsetHeight分别表示元素的整体宽度和高度,包括元素的边框、内边距和滚动条(如果有的话)。 - 计算方式:
offsetWidth = width + padding + border,offsetHeight = height + padding + border。
- 区别:
- scrollWidth 和 scrollHeight:
- 区别:
scrollWidth和scrollHeight表示元素的内容区域的总宽度和高度,包括不可见的部分(即滚动条不可见时的全部内容)。 - 计算方式:
scrollWidth包含整个内容区域的宽度,而scrollHeight包含整个内容区域的高度。
- 区别:
- clientWidth 和 clientHeight:
- 区别:
clientWidth和clientHeight表示元素的可见内容区域的宽度和高度,不包括滚动条和边框。 - 计算方式:
clientWidth包括元素内部可见区域的宽度,而clientHeight包括元素内部可见区域的高度。
- 区别:
- scrollTop 和 scrollLeft:
- 区别:
scrollTop和scrollLeft表示元素滚动条滚动的垂直和水平方向上的距离。 - 设置方式:可以通过设置这两个属性来控制元素的滚动位置,例如,
element.scrollTop = 100;将元素的滚动条垂直方向上滚动到距离顶部 100px 的位置。
- 区别:
- offsetTop 和 offsetLeft:
- 区别:
offsetTop和offsetLeft表示元素的顶部和左侧边缘相对于其包含元素的顶部和左侧边缘的距离。 - 计算方式:这两个属性提供了相对于包含元素的定位信息。
- 区别:
- event.clientX 和 event.clientY:
- 区别:
event.clientX和event.clientY表示事件发生时鼠标指针相对于浏览器窗口客户区域的坐标。 - 使用场景:通常用于处理鼠标事件,提供了鼠标指针在可见区域内的坐标。
- 区别:
新窗口与老窗口通信
当你使用 target="_blank" 打开一个新的标签页时,新页面的 window 对象上有一个属性 opener ,它指向的是前一个页面的 window 对象,因此,后一个新打开的页面就可以控制前一个页面了,事情就是这么的可怕。而且不管它是否跨域了,都是可以的。
加入了 rel="noopener noreferrer" 属性,就会 window.opener 会为 null
扩展运算符可以拷贝symbol键
尾调用
函数A最后的操作是调用函数B,那么函数A的指针在栈中就可以被释放掉,从而避免栈溢出
各种遍历触及区域
循环
- for...in 循环
- 触及:自身和原型链中的所有可枚举字符串键属性。
- 不触及:Symbol 属性,不可枚举属性。
- Object.keys(obj)
- 触及:自身的所有可枚举字符串键。
- 不触及:原型链,不可枚举属性,Symbol 属性。
- Object.getOwnPropertyNames(obj)
- 触及:自身的所有字符串键属性(包括不可枚举的属性)。
- 不触及:原型链,Symbol 属性。
- Object.getOwnPropertySymbols(obj)
- 触及:自身所有 Symbol 属性。
- 不触及:原型链,字符串键属性(无论是否可枚举)。
- Object.entries(obj) 和 Object.values(obj)
- 触及:自身所有可枚举字符串键属性。
- 不触及:原型链,不可枚举属性,Symbol 属性。
- Reflect.ownKeys(obj)
- 触及:对象自身的所有属性(包括字符串键、Symbol 属性,无论是否可枚举)。
- 不触及:原型链。
拷贝
- Object.assign(target, ...sources)
- 触及:源对象中的所有可枚举属性(包括字符串键和 Symbol 键)被复制到目标对象。
- 不触及:不可枚举属性,原型链中的属性。
- 扩展运算符 ...
- 触及:对象自身的所有可枚举字符串键属性。
- 不触及:Symbol 属性,不可枚举属性,原型链中的属性。
原型链查找机制是 隐式原型,所以产生以下结果
- 例1
- 例2

函数的 length 与 arguments 的 length 不是一个东西
关键字 void
后接表达式,不管表达式返回什么,始终返回 undefined,多用于立即执行函数对全局的影响